Dein Genie 3s, die 5 unbekannten WesenNun soll auch ein Z180-Prozessor Chef im System sein könnenHelmut Bernhardt, Arnulf Sopp Vorbemerkung: Im Folgenden ist viel von "wir" die Rede. Dies aus Gründen der Sprachökonomie. Jeder von uns machte aber in Wirklichkeit das, was er am besten konnte: Helmut die Hardware, Arnulf die Software. Das Pflichtenheft für beides entstand unter Mitwirkung etlicher Gebinde Hopfenbrause. Die HardwareVor längerer Zeit hatten wir unter ähnlichem Titel mal eine Erweiterung für den Genie IIIs beschrieben (1), mit der sämtliche Speicher (User-RAM, Video-RAM, HRG-RAM und Zeichengenerator-RAM) auf die vierfache Größe erweitert werden konnten. Außerdem fiel dabei noch ein SRAM ab, das parallel zum Boot-EPROM arbeitete. Dafür haben wir in den Sockel der Z80-CPU ein Adapter-Board gesteckt, das den Z80 aufnahm und einen schreib- und lesbaren Port bereitstellte, mit dessen Bits die Umschaltung dar Speicherbanks gesteuert wurde. Über dieses primitive Banking kann z.B. ein Genie 2s-Anwender, der auf eine HD64180-CPU umgerüstet hat (2), nur milde lächeln, wenn er seinen Computer mit 9,2 MHz (gegenüher 7,2 MHz des G3s) fährt. Es galt, dieses Manko beim G3s auszubügeln. Dafür haben wir ein neues Adapter-Board gebaut, auf dem nun kein Z80 (auch kein HD64180), sondern ein Z180 steckt. Der Z180 hat (wie auch der neuere HD64180-PLCC) 20 Adreßleitungen und kann damit über seine MMU und die beiden DMA-Känle 1 Megabyte RAM direkt adressieren. Um diese CPU so, wie sie gedacht ist, direkt zu nutzen, hätte das riesige Betriebssystem G-DOS 2.3 (oder Calva-DOS 2.4, die auf 1 Megabyte angepaßte Version) vollkommen auf HD64180-MMU-Banking umgeschrieben werden müssen. In über 63 kB SYS- und anderen systemeigenen Files hätten alle OUT-Befehle an die System-Steuerports F9h und FAh gesucht und auf entsprechende Z180-MMU-Befehle geändert werden müssen. Außer viel Arbeit hätte das auch die Kompatibilität mit anderen Computern dieser und ähnlicher Bauart gekostet. Da entschieden wir uns dafür, dem Calva-DOS sein Banking über die Systemteuerports zunächst mal zu erhalten. Die Ports F9h, FAh und FBh (früher F3h) auf dem Adapter-Board haben ihre volle Funktionsfähigkeit behalten. Nun ist aber der Einsatz eines HD64180 bzw. Z180 witzlos, wenn dessen MMU und DMAC nicht benutzt werden können. Wir haben beide Möglichkeiten eingerichtet: Nach dem Einschalt-Reset sind alle Systemport-Bits auf 0 gesetzt und ein voll G3s-kompatibler Computer incl. Erweiterung auf vierfache Speichergröße liegt vor. Durch Setzen des früher anders belegten Bits D6 in Port FBh kann aber umgeschaltet werden in einen lupenreinen Z180-Computer: alle Banking- und Common-Definitions-Bits der Systemports haben dann keine Funktion mehr. Das RAM wird ausschließlich durch die Adreßleitungen der CPU adressiert. Nur das Einblenden von memory mapped I/O-Baugruppen in die dafür vorgesehenen physikalischen Adreßbereiche erfolgt, wie im G3s-Modus, durch die entsprechenden Systemport-Bits. Gleichwohl sind deren logische Adressen variabel. Der G3s dekodiert bei ihrer Selektion nur die Adreßbits 0-1. Wie der Z180 derzeit sein physikalisches Megabyte in bis zu drei logische Adreßbereiche unterteilt, indem er mit A12-A19 jongliert, da redet ihm der G3s nicht drein. Um die Ausmaße eines Adapter-Boards mit diesen Umschaltmöglichkeiten (s. Foto) in Grenzen zu halten, mußten wir zwei PALs einsetzen. PAL 1 erzeugt lediglich die Port-Freigabesignale /OUTFB und /INFB (und noch einige weitere Freigabesignale - s. PAL-Listing), mit denen das Latch 74LS273 und der Lesetreiber 74LS244 angesteuert werden, die den zusätzlichen Port BFh realisieren. Die eigentliche Steuerung der RAM-Adressierung leistet PAL 2. Durch die Ausgänge /CAS0-/CAS3 wird eine der vier Reihen von 41256er RAM-Chips selektiert. A16 und A17 wählen darin einen 64 kB-Block an. Für die Adressierung im Z180-Modus gelangen die Adressen A16-A19 an das PAL. Im G3s-Modus erfolgt das Banking durch die Bits D6 und D7 von Port F9h sowie D0 und D1 von Port FBh. D7 von Port FBh entscheidet, ob bei logischer Adressierung im eingestellten Common-Bereich (0000h-3FFFh oder E000h-FFFFh) nur innerhalb eines 256 kB-Bereichs oder innerhalb des gesamten 1 MB-Speichers der unterste 64 kB-Block adressiert werden soll. Der Zugriff auf den eingestellten Common-Bereich wird durch das high aktive Signal COMLH (U84, 74LS00 Pin 11 auf dem CPU-Board) angezeigt. Dieses Signal wird ebenfalls an das PAL geführt (wie auch D1 von Port FBh. das die Auswirkung von COMLH steuert), Durch D6 von Port FBh erfolgt schließlich die Steuerung ob der G3s-Modus oder der Z180-Modus für die Adressierung des RAMs zuständig ist. Das PAL-Assemblerlisting veranschaulicht alle diese Steuerfunktionen. Damit die Signale/CAS0 - /CAS3 anstelle, der bisherigen Signale /CAS0 - /CAS3 an die RAMs gelangen, ist U43, 74LS125 zu entfernen. Die Signale /CAS0 - /CAS3 des Adapter-Boards werden den RAMs über die Pins 3, 6, 11 und 8 der Fassung von U43 zugeführt. Die an diesen Pins liegenden Pull up Widerstände R57-R60 sollten ausgelötet werden. Die Versorgung mit +5V und GND kann von den Pins 14 und 7 derselben Fassung erfolgen. Und schließlich liefert ihr Pin 9 auch noch das Signal /CAS für den Adapter. Alle Signale, die dem Adapter-Board vom CPU-Board zugeführt werden müssen, werden über den Stecker CN2 geführt; ebenso die Signale die das Adapter-Board dem CPU-Board liefert. Nur die ursrünglichen Z80-Pin-Signale laufen über den Sockel des Z80. Der Einsatz eines Z180 bringt aber auch neue Probleme mit sich. Beim Z80 wird der Sysemtakt extern erzeugt und der CPU über Pin 6 eingespeist. Beim HD64180 und beim Z180 wird der Systemtakt, von der CPU geliefert. Dieser Takt wird intern aus einem von außen zugeführten, doppelt so hohen Takt hergeleitet. Der G3s hat die Möglichkeit (leider auch die Notwendigkeit), zwischen einer hohen Frequenz und den normalen 1,77 MHz des TRS-80 umzuschalten. Diese Umschaltung muß bereits mit dem doppelten Muttertakt erfolgen. Es muß also zwischen 18.332 und 3,55 MHz umgeschaltet werden. Dadurch kann die CPU nicht mehr mit einem normalen Quarz, an den Pins XT und EXT beschaltet werden. Es müssen externe Oszillatorschaltungen benutzt werden. Der jeweils selektierte Takt wird über einen Treiber (74LS125) an den Pin EXT der CPU geschaltet. Die Auswahl des jeweiligen Taktes wird durch die Signale LO (U41, 74LS74, Pin 9) und HI (U41, 74LS74 Pin 8) auf dem CPU-Board gesteuert. Die bisherige Taktquelle im System wird durch Entfernen von U44, 74LS161 abgeschaltet. Damit der nun von der CPU gelieferte Systemtakt auch auf dem CPU-Board verfügbar wird, müssen die Pins 5 und 6 von U39, 74LS125 aus der Fassung gebogen werden und die Pins 5 und 6 der Fassung miteinander verbunden werden. Die Widerstände R51, R52 und R79 sollten entfernt werden. Die für das ursprüngliche 256 kB-Banking des G3s verantwortlichen Bits 6 und 7 des Ports F9h (hier als Signale F96 und F97 bezeichnet) sind von den Pins 14 und 13 von U88, 73LS139 zu beziehen. Die vom Port FBh auf dem Adapter-Board zur Vervierfachung von Video- RAM, Zeichensatz-RAM und HRG-RAM gelieferten Bits 2-5 (FB2-FB5) werden in dieser Reihenfolge an folgende IC-Pins der Hauptplatine geführt:
U13', 73LS157, Pin 6 U13' ist ein mit den Pins 1, 8, 15 und 16 huckepack auf U13, 74LS157 gelötetes IC 74LS157. Die weitere Beschaltung dieses ICs gibt folgende Abbildung wieder: U15' ist ebenfalls ein auf U15, 74LS157 mit den Pins 1, 8, 15 und 16 huckepack gelötetes weiteres IC 74S157. Die Pins 15 und 16 von BIG1, 6845 sind aus der Fassung zu biegen und mit U13' zu verdrahten. Schließlich sind noch die Adressen A16 und A17 von CN2 den RAMs gemultiplext zuzuführen. Das Multiplexen bsorgt ein auf U34, 74S157 wiederum mit den Pins 1, 8, 15 und 16 huckepack gelöteter 74S157 (U34'), der an den Pins 13 und 14 mit A16 und A17 zu versorgen ist. Der Multiplex-Ausgang Pin 12 wird über 33 Ω mit den Pins 1 aller RAMs (32x 41256) verbunden. Zur Vereinfachung des bis hierhin Gesagten sei das alles noch einmal in einer Tabelle wiedergegeben:
PAL16L8 10.03.90 H. Bernhardt, PAL1 Portdecodierung im GIIIs mit Z180 für zusätzl. Systemports A0 A1 A2 A3 A4 A5 A6 A7 WR GND RD OUTFB OUTFC OUTF3 IODC INF3 INFC IORQ INFB VCC /INFB = /IORQ * /RD * A7 * A6 *A5 * A4 * A3 * /A2 + A1 * A0 /OUTFB = /IORQ * /WR * A7 * A6 *A5 * A4 * A3 * /A2 + A1 * A0 /INFC = /IORQ * /RD * A7 * A6 *A5 * A4 * A3 * A2 + /A1 * /A0 /OUTFC = /IORQ * /WR * A7 * A6 *A5 * A4 * A3 * A2 + /A1 * /A0 /INF3 = /IORQ * /RD * A7 * A6 *A5 * A4 * /A3 * /A2 + A1 * A0 /OUTF3 = /IORQ * /WR * A7 * A6 *A5 * A4 * /A3 * /A2 + A1 * A0 /IODC = /IORQ * * A7 * A6 *A5 * A4 * A3 * /A2 PAL16L8 10.03.90 H. Bernhardt, PAL2 RAM-Steuerung im GIIIs mit Z180 ZA16 ZA17 FB0 FB1 COMLH F96 F97 FB6 FB7 GND CAS A17 CAS1 CAS2 CAS3 CAS0 ZA18 ZA19 A16 VCC /ZA16 = /FB6 * /F96 + /FB6 * COMLH + FB& * /ZA16 /ZA17 = /FB6 * /F97 + /FB6 * COMLH + FB6 * /ZA17 /CAS0 = /FB6 * /CAS * /FB1 * /FB0 + /FB6 * /CAS * COMLH * /FB7 + FB6 * /CAS * /ZA19 * /ZA18 /CAS1 = /FB6 * /CAS * /FB1 * FB0 * /COMLH + /FB6 * /CAS * /FB1 * FB0 * FB7 + FB6 * /CAS * /ZA19 * ZA18 /CAS2 = /FB6 * /CAS * FB1 * /FB0 * /COMLH + /FB6 * /CAS * FB1 * /FB0 * FB7 + FB6 * /CAS * ZA19 * /ZA18 /CAS3 = /FB6 * /CAS * FB1 * FB0 * /COMLH + /FB6 * /CAS * FB1 * FB0 * FB7 + FB& * /CAS * ZA19 * ZA18
Die SoftwareDer Z180 verleitet mit seiner interessanten MMU (Memory Management Unit) und seinem DMAC (Direct Memary Access Controller) geradezu zu Spielereien. Der Leser sei versichert daß wir ihnen auch ausgiebig frönten. So ist es z. B. kein Problem, den Bildschirm oder irgendeinen anderen physikalichen Speicherabschnitt logisch gleich dreimal an verschiedenen Adressen im 64 kB-Fenster der CPU vorliegen zu haben. Hier soll aber ganz bierernst nur vorgestellt werden, was an Änderungen im DOS und Unterstützungen für das DOS prgrammiert wurde, um die Vorteile der neuen CPU nutzen zu können. Zum Verständnis dessen, was sich nun eigentlich zum Besseren ändert, möchten wir außer den im Hardware-Teil schon genannten Veröffentlichungen noch auf ein Sonderheft des Club-80 (3) und einen Info-Artikel (4) hinweisen, die zum Thema HD64180 erschienen sind. Diese CPU ist softwaremäßig identisch mit dem Z180. Eine erneute Beschreibung der im wesentlichen gleichen Eigenschaften erübrigt sich an dieser Stelle. Es sind vier Programme, die für den Z180 geändert bzw. neu erstellt wurden: Patches in zwei verschiedenen Teilen von SYS0/SYS konfigurieren den Z180, um seine Arbeitsgeschwindigkeit und seine MMU auf optimale Werte einzustellen und um seinen DMAC dem System verfügbar zu machen. SYS26/SYS ist zuständig, um die SYS-Files des DOS in Bank 0 des Speichers zu puffern. Es wird nun nur noch angesprungen, wenn nicht der Rechtspeil gedrückt wurde (was bedeuten würde, daß das DOS nicht gepuffert werden soll). In SYS26 steht nun der DMA-Treiber aus dem neuen SYS0 bereits zur Verfügung, was alle Blockladevorgänge beschleunigt. Die Pufferung der DOS-Moduln benötigt jetzt nicht mehr das aufwendige Banking, das bisher erforderlich war, denn der DMAC kann von überall her den vollen Adreßbereich des Z180 überstreichen. Eine Änderung in der SYS-Laderoutine, für den DOS-Kern ebenfalls in SYS26 untergebracht, lädt nun die SYS-Programme bei einem DOS-Request mit RST 28h per DMA entsprechend schneller und weniger speicheraufwendig. Daß im Zuge dessen viel Platz in SYS26 frei wurde, der edleren Zwecken zur Verfügung gestellt werden kann, sei nebenbei erwähnt. Zudem ist der besondere Sektorpuffer 3A00h-3AFFh für die SYS-Moduln jetzt nicht mehr notwendig - freier Speicher für andere Anwendungen. Dann entstand ein Anwenderfile (bei uns TRAP/CMD geheißen), das hauptsächlich Gerald Schröders Illegal-Trap-Programm in Bank 0 und Bank 1 an die logische Adresse 0000h patcht. Hier springt der Z180 nämlich hin, wenn er einen Befehl antrifft, den er nicht kennt (für nähere Erleuterungen möchten wir auf Geralds Artikel im Info Nr. 17 verweisen). Außerdem wird hier die Delay-Routine an 0060h verlangsamt, denn der Z180 arbeitet zu schnell, um mit dem alten Verzögerungsprogramm noch die korrekten Wartezeiten zu erzielen. Und schließlich zimmerten wir ein Utility-Programm namens SYSTEST/CMD für den DOS-Tüftler (Listing 5). Wenn ein SYS-File, umgeschrieben wurde und nach Murphy's Gesetz noch Fehler enthalten muß, kann es zunächst in der Bank 0 gepuffert und (notfalls bei offenem Floppy-Türchen) von dort aus getestet werden. Damit erübrigt sich gleichzeitig die Notwendikeit, vor dem Test erneut zu booten, um die Datei in die Bank 0 zu kriegen, von wo sie beim gebankten DOS aufgerufen wird. Alle Änderungen in SYS0 und SYS26 sowie die neuen Files TRAP/CMD und SYSTEST/CMD sind in den Listings wiedergegeben. Weitere Teile, die sich in den beiden SYS-Programmen nicht geändert haben, sind mit LIST OFF ausgespart worden, um den Rahmen dieses Sonderhefts nicht zu sprengen. Dasselbe gilt für TRAP/CMD, soweit es Geralds bereits bekanntes Trap-Programm betrifft. Damit hat der Leser natürlich die Schwierigkeit, daß unklar bleibt, wo die Patches in den Files liegen sollen, und was sich in der Folge sonst noch ändert. Sorry - da können wir nur anbieten, eine Systemdiskette bei Arnulf anzufordern. Die Listings sollen lediglich den Umgang mit den neuen Möglichkeiten des Z180 demonstrieren und die sich ergebenden Voreile besingen. Es werden auch kleinere Teile der Listings unverständlich bleiben, weil sie sich auf nicht gelistete Programmabschnitte beziehen. Es handelt sich nämlich nicht um besondere Schöpfungen für dieses Sonderinfo, sondern um die Sources für das geänderte DOS. Wenn etwa Labels auftauchen, die sonst nirgends wiederzufinden sind, einfach darüber hinweglesen! Die genannten Programme sind auch noch längst nicht der Weisheit letzter Schluß. So ist es beispielsweise wünschenswert, einige Konfigurationen des Z180 (WAIT-Zyklen, Refreshes, MMU, vielleicht noch mehr) bereits im Boot-EPROM erledigen zu lassen. So weit sind wir jedoch selbst noch nicht. Gegf. wird man in einem kommenden Clubinfo Weiteres dazu vorfinden. Soweit Befehle enthalten sind, die zwar der Z180, nicht aber der Z80 kennt, sind sie mit ihren Hex-Entsprechungen als DB-(DEFB-)Statememts eingefügt. ZEUS kennt sie nämlich bedauerlicherweise auch nicht. In einem Kommentar erscheint dann jeweils der Befehl in Z180-Assembler. Die Programme sind essentiell für das Betriebssystem. Ohne Betriebssystem kein Computer. Daher wird unbedingt empfohlen, alles zunächst mit einer Kopie der Systemdiskette auszuprobieren (für SYS29 kann aber auch SYSTEST gefahren werden!). Erst, wenn sich die Kopie als funktionstüchtig erwiesen hat, hat die alte Systemdisk ausgedient! Nun zu den Programmen im einzelnen:SYS0/SYS ist die Seele des G3s. Es ist in seinem ersten Teil eine Fortsetzung von DOS/SYS. Hier ist die erste Modifikation für den Z180 untergebracht: Die Anzahl der WAIT-Zyklen für Speicher- und Portzugriffe wird eingestellt, und zwar auf den schnellstmöglichen Wert. Sollte er sich im Einzelfall als Überforderung des Systems herausstellen, kann der Wert 00h für den Akku mit DDE auf einen anderen Betrag gepatcht werden (XOR A hätte den Akku ebenfalls gelöscht, jedoch ohne die Möglichkeit einer einfachen Änderung). Danach wird die MMU des Z180 auf den Normalzustand des G3s eingerichtet. So kann, etwa für einen DMA (s. u.), die Z180 Speicherkonfiguration in aller Regel geschaltet werden, ohne daß sich etwas am Banking-Zustand ändert. Die zusätzlichen Befehle (s. Listing 1) werden einfach in die (zuvor per Disassembly gewonnene) Source eingefügt, das Programm neu assembliert. Es besteht aus zwei Sektoren, die in die ersten beiden Sektoren von SYS0/SYS gepatcht werden (das kann z. B. SUPERZAP). Das Listing 2 zeigt ebenfalls einen Patch in SYS0. Anfangs wird getestet, ob der Rechtspfeil während des Bootens gedrückt wurde. Ist das nicht der Fall, möchte der User das DOS in Bank 0 des Computers puffern, um es später ohne die Laufwerke verfügbar zu haben. Dieser Test war bisher in SYS26 untergebracht. Es erschien uns überflüssig, SYS26 anzuspringen, wenn es bei gedrücktem Rechtspfeil ohnehin gleich wieder verlassen wird. Dann enthält das Listing einen Treiber für den DMAC des Z180. Er erwartet beim Einsprung in HL die Anfangsadresse des zu transferierenden Blocks, in DE die Zieladresse, in BC den Bytezähler. Bis hierher entspricht der Treiber dem Z80-Befehl LDIR. Neu ist der Inhalt des Akkus, der in seinen beiden Nibbles die Adressen A16-19 des Quell- und des Zielbereichs enthält. So kann ein DMA auf das volle Megabyte des Z180-Adressraums zugreifen. Die internen DMAC-Register SAROB (Kanal 0, Quelle, Bits 16-19) und DAROB (Kanal 0, Ziel, Bits 16-19) werden nur in ihren unteren 4 Bits beachtet. So war es zur Laufzeit- und Platzersparnis möglich, auf das Löschen der oberen 4 Bits zu verzichten: Der Befehl RRD (Zeile 94) rotiert die hier relevanten Bits 3-7 ins untere Nibble von DAROB, der folgende Befehl LD (scrphys),A packt einfach den kompletten Akku mit seinem unwichig gewordenen oberen Nibble nach SAROB. In Zeile, 102 wird die G3s-MMU deaktiviert, indem in Port FBh das Bit 6 gesetzt wird (s. Hardware-Teil). Nur so kann der DMA-Treiber über das ganze Megabte verfügen. Ansonsten könnte nur das 64 kB-Fenster, das gerade vom G3s bearbeitet wurde, vom DMAC überstrichen werden. Also ist beim Einsprung in die DMA-Routine unbedingt darauf zu achten, daß die MMU-Konfiguration des Z180 mit der des G3s zumindest in wichtigen Speicherabschnitten übereinstimmt: Der Treiber muß sich nach dem Umschalten selber wiederfinden können, der Stack muß ebenfalls an derselben logischen Adresse vorliegen. Erst nach dem Rückschaltbefehl (Zeile 111) ist Entwarnung gegeben. Bei der Rückkehr aus dem Programm enthalten alle Register ihren alten Wert, der gerettet wurde. Im Gegensatz dazu gibt der Befehl LDIR die Quell- und Zielregister um den Betrag des Bytezählers erhöht zurück. BC selbst ist dann 0000h. Dieser Service hätte mit in den Treiber eingebaut werden können, der verfügbare Platz reichte jedoch nicht. Zudem haben beide Möglichkeiten ihre Vor- und Nachteile. An dieser Portion von SYS0 ist nur der filerelative Sektor 10h interessant. Das ist der diskreltive Sektor 15h. Die Source gem. Listing 2 wird assembliert. Von der so entstandenen CMD-Datei muß nun (mit SUPERZAP oder wie auch immer) der erste Sektor nach SYS0 kopiert werden, und zwar in den eben bezeichneten Sektor. Wichtig ist, daß dieser Sektor des CMD-Programms genau am relativen Byte FFh aufhört, also ganz unten rechts. Danach, im nächsten Sektor, folgt der Rest, der mit einem neuen Record-Header beginnt. Bis dorthin können NOPs bzw. DW 0000h- oder DB 00h-Statements eingefügt werden. Um das Puzzle zu erleichtern, folgt hier ein Sektor-Dump der den relativen Sektor 10h von SYS0 wiedergibt: file: SYS0/SYS drv: 0 frs: 0010h drs: O015h 00: 018C 0032 3E40 D3F9 FBC1 D1E1 C9E5 D5C5 2 >@ 10: 3E01 F3D3 F9C3 0AF0 3A07 43F6 3032 8232 > : C 02 2 20: E60F FE04 2o11 3AF8 42CB 5F28 0A3A 4038 : B ( :@8 30: E640 3EFC CC02 4421 7F32 1180 4401 0B00 @> D! 2 D 40: EDB0 1180 4421 0042 CD24 4428 0BFE 1820 D! B $D( 50: 2B3E 0132 0743 180E EBCD 284C 201E 1162 +> 2 C (L b 60: 32D5 1198 31E9 2100 3011 AD4E 0100 023E 2 1 ! 0 N > 70: 10CD BD35 E1F1 32F9 42C3 6744 F5CD C901 5 2 8 gD 80: 3E46 EF4F 564c 782F 5359 533A 300D 0170 >F OVLx/SYS:0 p 90: BB35 22F0 35ED 53F3 35ED 43F6 35E5 21F5 5" 5 s 5 C 5 # A0: 3577 ED67 32F2 3521 F735 C501 2708 F5D8 5w g2 5! 5 B0: FBF5 F640 F3D3 FBED 9B01 3102 ED9B F1D3 @ 1 C0: FBF1 C1E1 C940 0200 0000 0000 0000 0000 @ D0: 0000 0000 0000 0000 0000 0000 0000 0000 E0: 0000 0000 0000 0000 0000 0000 0000 0000 F0: 0000 0000 0000 0000 0000 0000 0000 0000 Es ist ausreichend, das im Hex- und im ASCII-Teil gelb hinterlegte Zählbyte des Record-Headers (rel. Sektorbyte 8Fh) genau so zu zappen um den Rest auszunullen. Dann dürfte nichts mehr schiefgehen. Voraussetzung ist, daß das Zählbyte auch an dieser Stelle steht. Ansonsten muß es eben auf andere Weise angepaßt werden, damit das letze Datenbyte des Sektors an der sektorrelativen Stelle FFh zu liegen kommt. Listing 3 behandelt ein paar Änderungen in SYS26. Dort wird, wie schon erwähnt, das Puffern des DOS im Speicher veranlaßt. Gleichzeitig wird der DOS-Kern gepatcht: Soll ein SYS-File mit RST 28h geladen werden, wird nicht mehr die Floppy angeworfen. Statt dessen wird das Programm aus der Bank 0 geholt. Dafür dient ein besonderes Minimal-DIR: Pro SYS-Modul enthält es zwei Bytes. Das erste ist das MSB der Pufferadresse in Bank 0. Da das LSB immer 00h ist, da also jedes SYS-File am Anfang eines 256Byte-Blocks beginnt, genügt das MSB. Das zweite Byte gibt die Länge des Files in Sektoren an. Gepuffert werden nur die Programme SYS1-19. GDOS/SYS, IHHALT/SYS und SYS0/SYS haben hier keine Bedeutung und bleiben deshalb auf der Floppy. Ihr Platz im Mini-DIR ist mit Nonsene (GDOS) bzw. mit Nullen (INHALT und SYS0) gefüllt. Eine spezielle Laderoutine für SYS-Programme liest dieses DIR und transferiert dann die Sektoren ursprünglich nach 3A00h, einen besonderen Sektorpuffer. Von dort wird das File sektorweise in den Overlay-Speicher des DOS geladen und schließlich angesprungen. Hier die Änderungen die die Vorteile des Z180 ausnutzen: Der DMAC benötigt kein Banking, um Daten zu transportieren. Die Unterprogramme, die das DOS in den Speicher laden und es später beim Betrieb von dort wieder abholen, konnten deshalb wesentlich verkürzt (und damit beschleunigt) werden. Das UP putsys puffert die SYS-Files. Dazu wird zunächst der Teil von INHALT/SYS ab 5200h in den Speicher geladen, der SYS-Programme enthält. Der Platzbedarf von 0800h Bytes zerstört dabei nach Reset den Inhalt des Anwenderspeichers. Daher wird (ab Label boot) zunächst dieser Bereich in die Bank 1 gerettet um später restauriert zu werden. Dann wird das besondere SYS-DIR im Block 3900h eingerichtet. Die ersten Bytes des Blocks müssen ausgenullt werden, damit bei einem DOS-Request nicht versucht wird, INHALT oder SYS0 aus der Bank 0 zu holen; die Nullen sind Signalbytes für das Verbot. Anschließend wird ab 4100h in Bank 0 das restliche DOS abgelegt. Mit der Restauration des Anwenderspeichers und dem Transfer des SYS-DIR an seine endgültige Adresse 4000h in Bank 0 endet dieser Teil von SYS26. Der Patch im DOS-Kern, der SYS-Dateien aus der Bank 0 holt, ist anschließend gelistet. Der verfügbare Speicherplatz im residenten Teil von SYS0 (ab 4BE1h) reicht dazu nicht aus. Ein notwendiges Unterprogramm macht deshalb an der Stelle 3738h weiter (was auch bisher schon so war). Dieses UP kann nun per DMA auf aufwendiges Banking verzichten, das zuvor nötig war. Immerhin 13 Bytes wurden frei die Arbeitsgeschwindigkeit stieg enorm. Das nächste Programm, das mit Listing 4 hier vorgestellt werden soll, ist in dieser Form ein reines Anwender-File. Wegen seiner Wichtigkeit erscheint es sinnvoll, es später einer SYS-Datei einzuverleiben, vielleicht gleich SYS26. Es nimmt ein paar Patches im BASIC-Interpreter vor, die dem Z180 gerecht werden. Seine Arbeitsgeschwindigkeit ist deutlich höher als die des Z80, weil viele Befehle weniger Taktzyklen beanspruchen. Dadurch beschleunigt sich die Delay-Routine an 0060h bedenklich. Wartezeiten, die dort z.B. für den Floppy-Controller abgetrödelt werden, sind nun zu kurz. Eine geringfügige Änderung schafft Abhilfe, so daß die Verzögerungen fast genau mit der alten Zeiten identisch werden: In der alten Version wird mit einem JR NZ-Befehl in die Schleife zurückverzeigt, wenn der Zähler BC noch nicht abgelaufen ist. Die neue Variante durchläuft zuerst den Befehl RET Z, und zwar jedesmal. Hat der Zähler noch etwas Stoff, geht es mit bedinungslosem JR zurück in die Schleife. Der zusätzliche Return-Befehl, der bei jedem Schleifendurchlauf gelesen werden muß, kostet die erwünschten Taktzyklen zur Verlangsamung. Dies alles trifft freilich nur bei der langsameren Takt-Fequenz von 1,77 MHz zu, die über Port FAh, Bit 6 gewählt werden kann. Alle kritischen Verzögerungsschleifen des DOS werden jedoch, soweit uns bekannt, erst nach dieser Taktumschaltung durchlaufen. Wo nicht, ist die verkürzte Laufzeit durch den High-Speed-Takt des Z180-Boards immerhin noch erträglich zu schnell. Direkt an die Delay-Schleife schließt sich der NMI-Service an. Der TRS-80 benutzt ihn als Reset-Ersatz. Beim G3s ist der NMI unbenutzt (hard- warermäßig übrigens auch nicht zugänlich - die freien Tasten links oben und unten in der Haupttastatur können mit dem NMI-Pin der CPU verdrahtet werden). Unsere Serice-Routine läßt einfach nur die Interrupts wieder zu. Damit können z. B. die Dreitastenbefehle aktiviert werden, wenn man etwa jederzeit mit dem Debugger den Speicher und die Reister im Auge haben möchte. Hauptbestandteil dieses Programms ist jedoch Gerald Schröders Error-Trap-Routine. Dorthin verzweigt der Z180, wenn ein ihm unbekannter Opcode angetroffen wird. Auch hier möchten wir wieder auf schon erschienene Erklärungen verweisen, um Wiederholungen zu vermeiden (Info Nr. 17). Beim Einsprung am Label start wird der Beginn der Trap-Routine, nämlich ein Sprung nach 1650h, nach 0000h ff. gezapt. Vor dem eigentlichen JP findet sich ein NOP. Hier kann der User bei einem Trap-Interrupt auch etwas anderes als diesen Sprung veranlassen. Mit F7h (RST 30h) an dieser Stelle wird z. B. in den Debuger gesprungen. Besonders in der Experimentierphase, wenn der Z180 noch neu ist, wird man das gelegentlich wollen. Bei 1650h sind die BASIC-Befehle im Klartext abgelegt. Das Trap-Programm überschreibt sie. Wer gerne in BASIC arbeitet, kann so natürlich nicht verfahren. Eine andere Adresse muß her. In einem kommenden Info wird die Lösung des Problems zu lesen sein. In Bank 1 soll ebenfalls Geralds Trap-Programm verfügbar sein. Dort ist ab 0000h Platz dafür, ein JP erübrigt sich. Diese neue Ladeadresse erfordert die Relokation aller festen Adressen im Trap-Pogramm. Das beginnt mit Zeile 188 im Listing. Der Vorgang ist etwas verzwickt. Wir möchten aber darauf verzichten, ihn über die Kommentare im Listing hinaus zu erleutern. Dies kann kein Lehrbuch über Z80-Assembler sein). Alle kritischen Adressen wurden mit einem Label versehen, addr1-addr15. addr1 ist im Listing sichtbar, die übrigen nicht. Diese Labels finden sich in der Tabelle addrtab wieder. Nur ein Detail soll beleuchtet werden. Weil der Leser u. U. nicht gleich RAMDISK (s. u.) über JP 4405h abfahren möchte: Beim Sprung nach 4405h wird über den Requestcode 63h nach SYS1 verzweigt. Mit, diesem code im Akku (ACHTUNG: mit etlichen anderen nicht!) wird als erstes der Stack neu eingerichtet, weil dabei eine Rückkehr zum Aufrufer nicht stattfinden soll. Für den CALL dma und die PUSHes und POPs im DMA-Treiber genügt ein vorübergehender Stack an beliebiger Stelle. Er wird hier (zeile 199,) kurz und schnell unter die Trap-Routine gelegt. Bei einem anderen Aussprung aus TRAP/CMD, ganz besonders mit RET, muß zuvor der Original-Stack unbedingt gerettet und nachher restauriert werden. Das geht mit dem Strickmuster nach dem auch die Zeilen 192 und 189/190 (in dieser Reihenfolge!) funkionieren. Das hätten wir unter Dreingabe von ein paar Bytes und Mikrosekunden natürlich auch hier so machen können, aber dieser schlitzohrigere Weg war halt gar zu verlockend. Nachdem nun die Trap-Routine auch nach Bank 1 tranferiert ist, wird zuletzt die RAM-Disk des G3s aktiviert. Dieser Programmbestandteil wäre verzichbar. Da wir aber immer mit der RAM-Disk arbeiten, kann das getrost gleich mit erledigt weren. Wenn nein: Unbedingt die Aussprungs-Bedingungen beachten (Stack, s. o.). Übrigens ist der ursprüngliche Name des Proramms MEMDISK/CMD. Hier handelt es sich um eine geänderte Version. SYSTEST transferiert ein CMD-Programm, das als SYS-File des DOS dienen soll, in die Bank 0, von wo die SYS-Dateien mit RST 28h aufgerufen werden. Prinzipiell geht das mit jeder Datei, in der Regel wird es sich jedoch um neue Versionen eines echten DOS-Moduls handeln. Es beginnt gem. Listing 5 mit der Prüfung, ob das DOS überhaupt schon in Bank 0 gepuffert ist. Das ist die Voraussetzung, weil sonst die neue Datei nicht mit RST 28h erreichbar wäre. Sollte das noch nicht geschehen sein, wird SYS26 (s. d.) mit FCh im Akku zuerst aufgerufen, um das DOS zu banken. Zum Test dient ein Lückenfüller-NOP, das bei der geänderten SYS-Laderoutine an der Stelle 4C0Bh stehen muß. Das eigentliche Arbeitsprogrogramm klärt nun zunächst, was für ein CMD-File in we1ches SYS-Programm kopiert werden soll. Diese Angaben können jedoch schon beim Aufruf gemacht werden, denn die Befehlssyntax ist SYSTEST<,FILSPEC<,SYSNR>>.Wenn der zweite oder beide Befehlsparameter weggelassen werden, wird nach ihnen gefragt. Dabei wird FILESPEC in der üblichen Weise, z.B. auch mit Laufwerksnummer, eingegeben. SYSNR ist nur eine Dezimzahl für SYSx/SYS. In der Bank 0 befinden sich nur die Files SYS1-29. Das Programm prüft daher auch, ob mit SYSNR eine zulässige Datei benannt wurde. Außerdem darf die Testdatei höchstens so lang sein wie die Zieldatei in Bank 0. Sonst würde das dahinter liegende SYS-File übesschrieben werden. In diesem Falle, wie überhaupt bei jedem denkbaren Fehler, bricht das Pragramm mit einer DOS-Fehlermeldung ab. Dies geschieht mit einem Sprung nach DOSERR (4409h), wo der Stack neu eingerichtet wird. Daher durfte getrost ignoriert werden, ob gerade ein PUSH oder CALL den Stack verbogen hat. Auch hier sollen allzu weitschweifige Erklärungen des Programms vermieden werden. Die Kommentare mögen genügen. Für die ausgiebigen Aufrufe etlicher DOS-Routinen möchten wir auf Grossers "DOS-Buch" (5) verweisen, ohne das wir es übrigens wohl auch nicht geschafft hätten. Es sei nur darauf hingewiesen, daß wieder der DMA benutzt werden konnte, und daß ein komfortabler Befehl des Z180. MLT ww (3), das Umrechnen einer Dezimal- in eine Binärzahl erleichterte (zeile 31/32). In der kommenden Zeit, liegt eine interessante Aufgabe in der weiteren Umgestaltung des Systems auf den Z180 hin. Wir würden uns freuen, wenn auch die Nachbauer des Z180-Boards gelegentlich mit Software im Club-Info vertreten wären. Vorschlag: Auch und gerade die RAM-Disk kann von der neuen CPU profitieren. Literatur:(1) Bernhardt, Sopp, Sonder-Info "Dein GIIIs, die 4 unbekannten Wesen", Michelbach,/Bilz 1986 (2) Bernhardt, "512k-RAM-Addressierung mit flexibler MMU", Club-Info 18, Michelbach/Bilz 1987 (3) Bernhardt, Schröder Sonder-Info "HD64180". Gschlachtenbretzingen 1989 (4) Schröder, "Z80, HD64180 und Illegals", Club-Info 17, Michelbach/Bilz 1987 (5) Grosser, "Das DOS-Buch", Aachen 1985
AnhangProbleme mit den IllegalsGeralds Trap-Programm ist eine wertvolle Hilfe, dennoch kein Allheilmittel. Von den vielen denkbaren Illegals, die im Code-Muster des Z80 stecken, sind längst nicht alle bereits entschlüsselt und dokumentiert. Die Trap-Routine müßte daher bei jeder neuen Entdeckung aktualisiert werden. Und der Z180 benutzt selber für seine neuen Befehle solche ehemals weißen Stellen in der Code-Matrix des Z80. Glücklicherweise beschieden sich seine Designer mit solchen Codes, die mit dem Switch-Byte EDh beginnen, so daß ein notwendiges Debugging verdächtiger Programme in Grenzen bleibt. Nämlich auch Illegals mit EDh werden schon irgendetwas beim Z80 bewirken, was auch immer. Die Illegal-Trap-Routine würde in diesem Falle überhaupt nicht angesprungen, denn es wäre für den Z180 ja ein sinnvoller Befehl. Einer dieser beiden Gründe wird es wohl sein, weshalb nach der Umrüstung des G3s auf den Z180 ausgerechnet mit ZEUS/CMD zahlreiche Abstürze auftraten. Aber vielleicht wurde auch Geralds Programm falsch abgetippt. Egal - es mußte etwas geschehen, denn mit ZEUS steht und fällt die Soft-Seite des ganzen Unternehmens: DSMBLR ist ein Disassembler, der gottlob keine Illegals akzeptiert, wie es z. B. ZEUS durchaus tut. Wenn man daher ein Programm disassembliert, das Illegals enthält, zuckt DSMBLR ratlos die Achseln und setzt DM-(DEFM-) Statements, wo er in seinem Vorrat keinen Z80-Befehl findet (DSMBLR und ZEUS behandeln DB und DM gleich, soweit es sich um einzelne Bytes handelt). So haben wir ZEUS ohne jegliches Screening disassembliert und nach DMs gesucht. An vier Stellen wurden wir fündig (Listing 6). In einem gesonderten File, mit dem wir seit jeher ZEUS patchen (ZAPZEUS/CMD, Listing 7), wurden Simulationen der Illegals programmiert, in ZEUS selbst CALLs nach dort gepatcht. ZAPZEUS (für diesen Zweck genügen die gelisteten Teile) kann so abgetippt und auf Papier assembliert werden. Die Bestandteile bis Zeile 46 werden etwa mit Hilfe von FED/CMD, mitten in ZEUS gezapt. Was dahinter liegt, muß im letzten Sektor von ZEUS angehängt werden. Der Ende-String (02-02-xy-xx) wird als neuer Record-Header (01-nn-yy-xx) geändert. Das Anhängsel-Programm bringt seinen eigenen Ende-String mit. Dafür ist es wichtig, daß seine Einsprungsadresse (END addr) die von ZEUS sein muß (s. Listing). Ob damit alles erledigt ist, muß die zukünftige Praxis zeigen. Ohne ein Screening-File für DSMBLR werden nämlich Texte und Tabellen wie Programmcode disassembliert. So ergeben sich Verschiebungen im "Programm"-Ablauf, die etwa ein Illegal-Switch-Byte wie einen harmlosen Bestandteil eines Sprungbefehls (Adresse, Distanz) erscheinen lassen können. Da das aber nur auftreten kann, wenn ein Illegal direkt an einen reinen Datenblock grenzt, darf man mit Recht auf Erfolg hoffen. Auch das Gegenteil wäre eine mögliche Fehlerquelle: Eine Tabelle, die ohne Screening ja nicht als solche behandelt wird, enthält ein verdächtiges Byte. Der Zufall will es, daß der Inhalt der Tabelle wie sinnvoller Programmcode aussieht. Ein dort gepatchter CALL würde die Tabelle verfälschen. Wir können nur raten, in solchen Fällen die betreffenden Stellen ganz besonders sorgfältig zu untersuchen ... ... und unbedingt das Ergebnis zur Veröffentlichung an Jens-80 Neueder zu schicken! 00001 ;Listing 6: Illegals in ZEUS/CMD 00002 ;ZEUS/CMD (hier nicht interessierende Teile sind mit LIST OFF 00003 ; ausgespart - erkennbar an den springenden Zeilennummern) 00004 ; mit LIST OFF ausgespart 52E7 DD 00305 DM Oddh ;DD 7D:' 52E8 7D 00306 LD A,L ;LD A,LX 52E9 FE28 00307 CP '+' 00308 5809 CB 00694 DM 0cbh ;CB 31 06 01: 580A 310601 00695 LD SP,m0106 ;SLIA C - LD 8,01 00696 5045 C8 00731 DM 0cbh ;C3 31 06 01: 5846 310601 00732 LD SP,m0106 ;SLIA C - LD 8,01 00733 64E9 CB 00700 DM 0cbh ;CB 37: 6AEA 37 00701 SCF ;SLIA A 00702 00000 Fehler ; mit LIST OFF ausgespart 00001 ;Listing 7: Illegal-Trap direkt in ZEUS/CMD 00002 ;ZAPZEUS/CMD (hier nicht interessierende Teile sind mit LIST 0FF 00003 ;ausgespart - erkennbar an den springenden Zeilennummern) ; mit LIST OFF ausgespart 00034 52E7 00035 ORG 52e7h ;dort Illegal LD A,LX 52E7 CD2830 00036 CALL ld_a_1x ;simulieren 00037 5809 00038 ORG 5b09h ;dort Illegal SLIA C 5809 CD3330 00039 CALL slia_c ;simulieren 00040 5845 00041 ORG 5b45h ;dort Illegal SLIA C 5845 CD3330 00042 CALL slia_c ;simulieren 00043 6AE9 00044 ORG 6ae9h ;dort Illegal SLIA A 6AE9 37 00045 SCF ;Cy für Bit 0 setzen 6AEA 17 00046 RLA ;rotieren ; mit LIST OFF ausgespart 00076 3000 00077 ORG 3000h ;wo es nicht stört ; mit LIST OFF ausgespart 00106 3028 DDE5 00107 ld_a_1x PUSH IX ;auf den Stack 302A E3 00108 EX (SP),HL ;HL retten, HL - IX 3028 7D 00109 LD A,L ;A - LX 302C E3 00110 EX (SP),HL ;HL und IX restaurieren 302D DDE1 00111 POP IX 302F F2BH 00112 CP 2bh ;überschriebenen Befehl nachholen 3031 1B05 00113 JR return ;zurück zur Fortsetzung 00114 3033 CB21 00115 slia_c SLA C ;C shiften 3035 0C 00116 INC C ;Bit 0 setzen 3036 0601 00117 LD B,01h ;überschriebenen Befehl nachholen 00118 3038 E3 00119 return EX (SP),HL ;HL - RET-Adresse 3039 23 00120 INC HL ;ein Byte später 303A E3 00121 EX (SP),HL ;zurücktauschen 303B C9 00122 RET ;an die neue Adresse zurückkehren 00123 5312 00124 END 5312h ;hier Einsprung in ZEUS 00000 Fehler |